/**
 * 这里的代码是RQMCRT中的，需要更改，改成自己的
 * 不从json文件里读取数据
 *
 * 把这里原来的静态的实例删去了
 */

#ifndef SOLARENERGY_CHIER_SCENECONFIGURATION_H
#define SOLARENERGY_CHIER_SCENECONFIGURATION_H

#include <cuda_runtime.h>

#include <string>
// #include "RayTracingParameter.h"
// #include "Scene.h"

// using namespace solar;

namespace solar
{
    class SceneConfiguration
    {
        public:
            SceneConfiguration() { sun_dir = make_float3(1.0f, 1.0f, 1.0f); }
            // static SceneConfiguration* getInstance();     //
            // 这里的静态的实例有什么用处吗？？？？问一下林 int loadConfiguration(std::string
            // configuration_file_path);     // 从路径文件中加载configuration参数

            // bool loadConfiguration(std::shared_ptr<Scene> scene,
            // std::shared_ptr<RayTracingParameter> simulation_paras_);

            /**
             * For tests:source/scene/Sun.h
             */
            auto getSun_dir() -> float3&; // 这里，计算sun_dir
            auto getDni() const -> float;
            auto getSunAzimuth() const -> float;
            auto getSunAltitude() const -> float;
            auto getCsr() -> float;
            auto corr_Csr() -> float;
            auto getNum_sunshape_groups() const -> int;
            auto getNum_sunshape_lights_per_group() const -> int;
            auto getInverse_transform_sampling_groups() const -> int;

            auto getReceiver_pixel_length() const -> float;
            auto getDisturb_std() const -> float;
            auto getHelio_pixel_length() const -> float;
            auto getReflected_rate() const -> float;
            // For tests
            const int num_of_fields = 11;

            //  void setSunAzimuth(float sun_azimuth);
            //  void setSunAltitude(float sun_altitude);
            //  void setDni(float dni);

            //------------add fllowing functions to set properties in 【ui：RayTracingProcessor】and
            // 【SceneLoader】------------------
            void setSunAzimuth(float sun_azimuth);
            void setSunAltitude(float sun_altitude);
            void setDni(float dni);
            void setCsr(float csr);
            void setNum_sunshape_groups(int num_sunshape_groups);
            void setNum_sunshape_lights_per_group(int num_sunshape_lights_per_group);
            void setInverse_transform_sampling_groups(int inverse_transform_sampling_groups);
            void setReceiver_pixel_length(float receiver_pixel_length);
            void setHelio_pixel_length(float helio_pixel_length);
            void setDisturbStd(float slope_error); // 其实就是slopeerror
            void setReflectedRate(float reflected_rate);

            void test();

        private:
            // static SceneConfiguration *sceneConfigurationInstance;      //
            // 整个项目中只有这一个静态SceneConfiguration对象

            float3 sun_dir{}; // --通过方位角和高度角计算得到
            float dni = 1000.0F;

            float sun_azimuth = 0.0F; // 方位角
            float sun_altitude = 0.0F; // 高度角                           // 前五个是sun的参数
            // ！！！每个微定日镜上的光锥数目(其实不是光锥数目，每个微定日镜只取一个光锥，这个值与随机数个数有关,)
            int num_sunshape_groups = 512;
            int num_sunshape_lights_per_group = 4096;         // 每个光锥内光线的数目
            int inverse_transform_sampling_groups = 1024 * 8; // 用于buie sunshape的插值逆变换采样

            float receiver_pixel_length = 0.08F; // 接收器像素大小
            float disturb_std = 0.02F;           // slopeerror的标准差
            float helio_pixel_length = 10.0F;    // 微定日镜大小
            float reflected_rate = 1.0F;         // 反射率

            // sunshape相关
            float csr = 0.1F;
            float sigma = 0.002F;
            int sunshape_type = 1; // 1-buie  2-gaussian  3-pillbox
    };
} // namespace solar

#endif // SOLARENERGY_CHIER_SCENECONFIGURATION_H
